package com.sunriz.motordrive.utils;

import com.sunriz.motordrive.domain.POJO.common.MsgRx16;
import com.sunriz.motordrive.domain.POJO.common.*;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: AnalyseMsg
 * Package: com.sunriz.analyse
 * Description:
 *
 * @Author BuTang
 * @Create 2024/1/13 15:41
 * @Version 1.0
 */
@Slf4j
public class AnalyseMsg {

    /**
     * 解析Tx03/Tx04报文
     * @param message Tx03/Tx04报文
     */
    public static MsgRx0304 Rx0304(String message){
        String[] msg = message.split(" ");

        Integer slaveId = Integer.parseInt(msg[0],16);
        Integer model = Integer.parseInt(msg[1],16);
        Integer startAddr = Integer.parseInt(msg[2]+msg[3],16);
        Integer num = Integer.parseInt(msg[4]+msg[5],16);
        Integer crc = Integer.parseInt(msg[6]+msg[7],16);

//        log.info("接收到{}报文{}，slaveId为：{}，功能码为：{}，起始寄存器地址为：{}，查询寄存器数量为：{}"+
//                "，crc校验码为：{}。",model,message,slaveId,model,startAddr,num,crc);
        return new MsgRx0304(slaveId,model,startAddr,num,crc);
    }

    /**
     * 解析Tx03/Tx04报文
     * @param message Tx03/Tx04报文
     */
    public static MsgTx0304 Tx0304(String message){
        String[] msg = message.split(" ");

        Integer slaveId = Integer.parseInt(msg[0],16);
        Integer model = Integer.parseInt(msg[1],16);
        Integer length = Integer.parseInt(msg[2],16);

        List<Integer> data = new ArrayList<>();
        for (int i = 0; i < length; i++) {
            data.add(Integer.parseInt(msg[3+i],16));
        }

        Integer crc = Integer.parseInt(msg[3+length]+msg[4+length],16);
//        log.info("发送{}报文{}，slaveId为：{}，功能码为：{}，寄存器长度为：{}，数据为：{}"+
//                "，crc校验码为：{}。",model,message,slaveId,model,length,data,crc);
        return new MsgTx0304(slaveId,model,length,data,crc);
    }

    /**
     * 解析RX/TX06报文
     * @param message  RX/TX06报文
     * @return MsgRxTx06
     */
    public static MsgRxTx06 Rx06(String message){
        String[] msg = message.split(" ");

        Integer slaveId = Integer.parseInt(msg[0],16);
        Integer model = Integer.parseInt(msg[1],16);
        Integer addr = Integer.parseInt(msg[2]+msg[3],16);
        Integer data = Integer.parseInt(msg[4]+msg[5],16);
        Integer crc = Integer.parseInt(msg[6]+msg[7],16);

//        log.info("接收{}报文{}，slaveId为：{}，功能码为：{}，寄存器地址为：{}，数据为：{}"+
//                "，crc校验码为：{}。",model,message,slaveId,model,addr,data,crc);
        return new MsgRxTx06(slaveId,model,addr,data,crc);
    }


    /**
     * 解析Rx16报文
     * @param message Rx16报文
     * @return MsgRx16
     */
    public static MsgRx16 Rx16(String message){
        String[] msg = message.split(" ");

        Integer slaveId = Integer.parseInt(msg[0],16);
        Integer model = Integer.parseInt(msg[1],16);
        Integer startAddr = Integer.parseInt(msg[2]+msg[3],16);
        Integer num = Integer.parseInt(msg[4]+msg[5],16);
//        Integer length = Integer.parseInt(msg[6],16);

//        List<Integer> data = new ArrayList<>();
//        for (int i = 4; i < msg.length-2; i++) {
//            data.add(Integer.parseInt(msg[i],16));
////            data.add(Integer.parseInt(msg[7+i]+msg[8+i],16));
//        }

        Integer crc = Integer.parseInt(msg[6]+msg[7],16);
//        log.info("接收{}报文{}，slaveId为：{}，功能码为：{}，起始寄存器地址为：{}，寄存器数量为：{}，字节长度为：{}，数据为：{}"+
//                "，crc校验码为：{}。",model,message,slaveId,model,startAddr,num,length,data,crc);
        return new MsgRx16(slaveId, model, startAddr, num, crc);
    }

    public static MsgTx16 Tx16(String message){
        String[] msg = message.split(" ");

        Integer slaveId = Integer.parseInt(msg[0],16);
        Integer model = Integer.parseInt(msg[1],16);
        Integer startAddr = Integer.parseInt(msg[2]+msg[3],16);
        Integer num = Integer.parseInt(msg[4]+msg[5],16);

        Integer crc = Integer.parseInt(msg[6]+msg[7],16);
//        log.info("发送{}报文{}，slaveId为：{}，功能码为：{}，起始寄存器地址为：{}，寄存器数量为：{}"+
//                "，crc校验码为：{}。",model,message,slaveId,model,startAddr,num,crc);
        return new MsgTx16(slaveId, model, startAddr, num,  crc);
    }



}
